#!/bin/bash

# $1 - registro
validar_campos_reg_cabecera()
{
	local registro=$1
	local rexp1='^C,[0-9]\+,[^,][^,][^,],[0-9]*,[PLESO],[^,]\+,[IR][DIPC],[ETCP],[^,]*,[^,]*,\?.*'
	
	echo $registro | grep --silent '^C,.*$'
	if [ $? -ne 0 ];
	 then
		echo "falta registro de cabecera"
		return 13
	fi

	# valida que haya por lo menos 10 campos, esten o no informados
	echo $registro | grep --silent '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,\?.*'
	if [ $? -ne 0 ];
	 then
		echo "campos faltantes"
		return 22
	fi

	# valida que todos los obligatorios esten informados
	echo $registro | grep --silent '^[^,]\+,[^,]\+,[^,]\+,[^,]*,[^,]\+,[^,]\+,[^,]\+,[^,]\+,[^,]*,[^,]*,\?.*'
	if [ $? -ne 0 ];
	 then
		echo "campos no informados"
		return 21
	fi

	echo $registro | grep --silent "$rexp1"
	if [ $? -eq 0 ];
	 then
		# valida que el campo persona solo tome uno de los 4 valores validos
		local per_relevada=`echo "$registro" | cut -d ',' -f 7`
		case $per_relevada in
			ID) ;;
			II) ;;
			RP) ;;
			RC) ;;
			*)  echo "error en valor del campo persona"
				return 44
			;;
		esac
		
		echo $registro | grep --silent '^C,[^,]\+,[^,][^,][^,],[^,]*,[PLESO],[^,]\+,[^,][^,],[^,],[^,]*,[^,]*,\?.*'
		if [ $? -ne 0 ];
		 then
			echo "error en valor del campo sitio"
			return 43
		fi
		echo $registro | grep --silent '^C,[^,]\+,[^,][^,][^,],[^,]*,[^,],[^,]\+,[^,][^,],[ETCP],[^,]*,[^,]*,\?.*'
		if [ $? -ne 0 ];
		 then
			echo "error en valor del campo modalidad"
			return 42
		fi
		echo $registro | sed 's@^C,\([0-9]\+\),\([^,][^,][^,]\),[0-9]*,\([PLESO]\),\([^,]\+\),\([IR][DIPC]\),\([ETCP]\),.*@\1,\2,\4,\3,\6,\5@'
		return 0
	fi
}

# $1 - registro
es_unico_num_encuesta()
{
	local num_enc=`echo $1 | cut -d ',' -f 2`
	grep --silent "^[^,]*,[^,]*,$num_enc,.*" "$sumario"
	if [ "$?" -eq "0" ];
	 then
		echo "número de encuesta repetido"
		return 1
	 else
		return 0
	fi
}

# $1 - registro
cant_preg_encuesta()
{
	local cod_enc=`echo $1 | cut -d ',' -f 3`
	encuesta=`grep -m 1 "^$cod_enc,.\+$" "$maestros/encuestas.mae"`
	if [ $? -eq 0 ];
	 then
		#cantidad de preguntas por encuesta
		echo $encuesta | cut -d ',' -f 3
		return 0
	 else
		echo "no existe la encuesta"
		return 1
	fi
}

# $1 - registro
validar_campos_reg_detalle()
{
	local registro=$1
	local rexp='^D,[0-9]\+,[0-9]\+,[0-9]\+,[^,]*,\?.*$'
	
#	echo $registro | grep --silent '^D,.*$'
#	if [ $? -ne 0 ];
#	 then
#		echo "Tipo de registro incorrecto"
#		return 1
#	fi

	echo $registro | grep --silent "$rexp"
	return $?
}

# $1 - registro
obtener_puntaje_reg()
{
	local id_pregunta=`echo "$1" | cut -d ',' -f 3`
	local respuesta=`echo "$1" | cut -d ',' -f 4`
	local pregunta=`grep -m 1 "^$id_pregunta,.\+$" "$maestros/preguntas.mae"`
	if [ $? -eq 0 ];
	 then
		local tipo=`echo "$pregunta" | cut -d ',' -f 3`
		local ponderacion=`echo "$pregunta" | cut -d ',' -f 4`
		case "$ponderacion" in
			ALTA)  puntaje=3;;
			MEDIA) puntaje=2;;
			BAJA)  puntaje=1;;
		esac
		if [ "$tipo" = "+" ];
		 then
			tipo=""
		fi
		echo "$tipo$puntaje * $respuesta" | bc
		return 0
	 else
		echo "no existe la pregunta"
		return 1
	fi
}

# $1 - ruta_archivo
procesar_archivo()
{
	local lei_regC=0
	local inv_encuesta=0
	local puntaje=0
	local total_preguntas=0
	local cant_preguntas=-1
	local datos_sum=""

	local ruta_archivo=$1
	local nombre_archivo=${ruta_archivo##*/}
	local userid=`echo "$nombre_archivo" | cut -d '.' -f 1`
	local fecha=`echo "$nombre_archivo" | cut -d '.' -f 2`
	#cargo el numero de encuesta del primer registro
	local num_enc_ant=`head -1 "$ruta_archivo" | cut -d ',' -f 2`
	echo "" > "$arch_temp"
	IFS='
'	
	for registro in $(cat "$ruta_archivo")
	 do
		#si tiene el mismo numero de encuesta que el anterior
		echo $registro | grep --silent "^[^,]\+,$num_enc_ant,.*"
		if [ $? -eq 0 ];
		 then
			#si se no debe invalidar el resto de la encuesta
			if [ $inv_encuesta -eq 0 ];
			 then
				if [ $lei_regC -eq 0 ];
				 then
					cant_preguntas=0
					lei_regC=1
					mensaje=`validar_campos_reg_cabecera "$registro"`
					inv_encuesta=$?
					if [ $inv_encuesta -eq 0 ];
					 then
						datos_sum="$mensaje"
						lei_regC=1
						mensaje=`cant_preg_encuesta "$registro"`
						inv_encuesta=$?
					fi
					if [ $inv_encuesta -eq 0 ];
					 then
						total_preguntas="$mensaje"
						mensaje=`es_unico_num_encuesta "$registro"`
						inv_encuesta=$?
					fi
					if [ $inv_encuesta -eq 0 ];
					 then
						echo ",$registro" > "$arch_temp"
					 else
						echo "$mensaje,$registro" >> "$nolistos"
					fi
				 else
					mensaje=`validar_campos_reg_detalle "$registro"`
					inv_encuesta=$?
					if [ $inv_encuesta -eq 0 ];
					 then
						mensaje=`obtener_puntaje_reg "$registro"`
						inv_encuesta=$?
						if [ $inv_encuesta -eq 0 ];
						 then
							operacion="$mensaje"
							puntaje=`echo "$puntaje + $operacion" | bc`
						fi
					fi
					if [ $inv_encuesta -eq 0 ];
					 then
						let cant_preguntas=cant_preguntas+1
						echo ",$registro" >> "$arch_temp"
					 else
						cat "$arch_temp" >> "$nolistos"
						echo "$mensaje,$registro" >> "$nolistos"
					fi
				fi
			 else
				echo ",$registro" >> "$nolistos"
			fi
		 else #cambio de encuesta
			if [ $inv_encuesta -eq 0 ];
			 then
				 if [ $cant_preguntas -eq $total_preguntas ];
				  then
					datos_sum=`echo "$datos_sum" | sed "s@\([0-9]\+,...,\)\(.\+\)@\1$puntaje,\2@"`
					echo "$userid,$fecha,$datos_sum" >> "$sumario"
				 else
					sed "1s@^C*@cantidad incorrecta de preguntas&@" "$arch_temp" >> "$nolistos"
					rm "$arch_temp"
				fi
			fi
			inv_encuesta=0
			lei_regC=0
			cant_preguntas=0
			num_enc_ant=`echo "$registro" | cut -d ',' -f 2`
			mensaje=`validar_campos_reg_cabecera "$registro"`
			inv_encuesta=$?
			if [ $inv_encuesta -eq 0 ];
			 then
				datos_sum="$mensaje"
				lei_regC=1
				mensaje=`cant_preg_encuesta "$registro"`
				inv_encuesta=$?
			fi
			if [ $inv_encuesta -eq 0 ];
			 then
				total_preguntas="$mensaje"
				mensaje=`es_unico_num_encuesta "$registro"`
				inv_encuesta=$?
			fi
			if [ $inv_encuesta -eq 0 ];
			 then
				echo ",$registro" > "$arch_temp"
			 else
				echo "$mensaje,$registro" >> "$nolistos"
			fi
		fi
	 done
	#puede ser una funcion no modifica nada
	if [ $inv_encuesta -eq 0 ];
	 then
		 if [ $cant_preguntas -eq $total_preguntas ];
		  then
			datos_sum=`echo "$datos_sum" | sed "s@\([0-9]\+,...,\)\(.\+\)@\1$puntaje,\2@"`
			echo "$userid,$fecha,$datos_sum" >> "$sumario"
		 else
			sed "1s@^C*@cantidad incorrecta de preguntas&@" "$arch_temp" >> "$nolistos"
			rm "$arch_temp"
		fi
	fi
}

#recibe 1 parámetro, el nombre del archivo, verifica si es un archivo que
#está listo, de ser así lo mueve a la carpeta de rechazados y escribe un 1
#por stdin en caso contrario escribe un 0
# $1 - nombre_archivo
verificar_archivo_duplicado()
{
	local nombre_archivo="$1"
	if [ -f "$listos/$nombre_archivo" ]; then
		${LIBDIR}/moverC.sh "$preparados/$nombre_archivo" "$rechazados" "sumarC"
		${LIBDIR}/loguearC.sh "sumarC" "I" "El archivo $nombre_archivo está duplicado, fue rechazado."
		return 1
	else
		return 0
	fi
}

procesar_preparados()
{
	local cant_archivos=0 #cantidad de archivos procesados =>cant de no procesados
	local lista_archivos=`ls -1 "$preparados"`
	if [ $? = 0 ]; then
		local total_archivos=`echo "$lista_archivos" | wc -l`
#grabar en log en vez de mostrar por pantalla
echo "Inicio de SumarC: $total_archivos"
		for archivo in $lista_archivos
		do
#grabar en log en vez de mostrar por pantalla
echo "Archivo a Procesar: $archivo"
			verificar_archivo_duplicado $archivo
			if [ $? -eq 0 ]; then
				let cant_archivos=cant_archivos+1
				procesar_archivo "$preparados/$archivo"
				#mover archivo a listos
				${LIBDIR}/moverC.sh "$preparados/$archivo" "$listos" "sumarC"
			fi
		done
	fi
}


###################################################
#borrar despues viene seteado de afuera           #
export maestros="$GRUPO/mae"				  	  #
export sumario="$GRUPO/ya/encuestas.sum"		  #
export preparados="$GRUPO/preparados"			  #
export rechazados="$GRUPO/rechazados"			  #
export listos="$GRUPO/listos"					  #
export nolistos="$GRUPO/nolistos/encuestas.rech"  #
#borrar despues viene seteado de afuera           #
###################################################
export arch_temp="$GRUPO/tmp.tmp"

procesar_preparados
